import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import pandas as pd

def fetch_project_weekly_reports(url):
    """
    爬取指定URL下的项目周报列表，包括标题、内容摘要和链接。
    
    参数:
        url (str): 目标网页的URL。
        
    返回:
        list: 包含字典的列表，每个字典包含一个项目的标题、内容摘要和链接。
    """
    # 发起HTTP GET请求
    response = requests.get(url)
    # 检查请求是否成功
    if response.status_code == 200:
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        # 找到所有项目周报的条目
        items = soup.find_all('div', class_='media-body')
        
        reports = []
        for item in items:
            # 提取标题
            title = item.find('a').get_text(strip=True)
            # 提取链接
            link = item.find('a')['href']
            # 使用urljoin确保链接是完整的URL
            link = urljoin(url, link)
            # 提取内容摘要
            summary = item.find('p').get_text(strip=True)
            
            # 获取文章具体内容
            content = fetch_article_content(link)
            
            reports.append({
                'title': title,
                'link': link,
                'summary': summary,
                'content': content
            })
        
        return reports
    else:
        print(f"请求失败，状态码：{response.status_code}")
        return []

def fetch_article_content(url):
    """
    爬取指定URL的文章具体内容。
    
    参数:
        url (str): 文章的URL。
        
    返回:
        str: 文章的具体内容。
    """
    # 发起HTTP GET请求
    response = requests.get(url)
    # 检查请求是否成功
    if response.status_code == 200:
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        # 假设文章内容在特定的 <div> 标签中
        content_div = soup.find('div', class_='news-details-content fontZoom f_113')
        if content_div:
            # 提取文本内容
            content = content_div.get_text(separator='\n', strip=True)
            return content
        else:
            print(f"未找到文章内容，URL: {url}")
            return "内容无法获取"
    else:
        print(f"请求失败，状态码：{response.status_code}, URL: {url}")
        return "请求失败"

if __name__ == '__main__':
    # 需要爬取的网站URL
    target_url = 'https://www.yidaiyilu.gov.cn/list/w/xmzb'
    
    # 获取项目周报列表
    project_reports = fetch_project_weekly_reports(target_url)
    
    # 将数据转换为DataFrame
    df = pd.DataFrame(project_reports)
    
    # 保存为Excel文件
    output_file = 'project_weekly_reports.xlsx'
    df.to_excel(output_file, index=False)
    
    print(f"数据已保存到 {output_file}")